package Modelo;

import java.util.*;







public class Cooperativa {
	
	
	// atributos
	
	private String codigo;
	
	private String descripcion;
	
	private String telefono;
	
	private ArrayList<Ruta> rutas;
	
	private ArrayList<Empleado>  empleados;
	
	private ArrayList<Socio> socios;
		
	private ArrayList<TipoUnidad> tiposunidades;
	
	
	//constructor sin parametros
	
	public Cooperativa(){
		super();
		this.rutas = new ArrayList<Ruta>();
		this.empleados = new ArrayList<Empleado>();
		this.socios = new ArrayList<Socio>();
		this.tiposunidades = new ArrayList<TipoUnidad>();
	}
	
	//constructor con parametros
	
	public Cooperativa(String codigo, String descripcion, ArrayList<Ruta> rutas, ArrayList<Empleado> empleados, ArrayList<Socio> socios, ArrayList<Multa> multas, ArrayList<TipoUnidad> tiposunidades, String telefono ){
		this.codigo = codigo;
		this.descripcion = descripcion;
		this.rutas = rutas;
		this.empleados = empleados;
		this.socios = socios;
		this.tiposunidades = tiposunidades;
		this.telefono = telefono;
	
	}
	
	
	
	
	public Cooperativa(String codigo, String descripcion, String telefono ){
		this.codigo = codigo;
		this.descripcion = descripcion;
		this.telefono = telefono;
	
	}
	
	//getters y setters
	
	public String getCodigo() {
		return codigo;
	}
	
	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	public ArrayList<TipoUnidad> getTiposunidades() {
		return tiposunidades;
	}

	public void setTiposunidades(ArrayList<TipoUnidad> tiposunidades) {
		this.tiposunidades = tiposunidades;
	}

	public String getDescripcion() {
		return descripcion;
	}
	
	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}
	
	// arreglos 

	
	public void setEmpleados(ArrayList<Empleado> empleados){
		this.empleados = empleados;
	}
	
	public ArrayList<Empleado> getEmpleados(){
		return empleados;
	}
	
	public void setSocios(ArrayList<Socio> socios){
		this.socios = socios;
	}
	
	public ArrayList<Socio> getSocios(){
		return socios;
	}

	
	public void setRutas(ArrayList<Ruta> rutas){
		this.rutas = rutas;
	}
	
	public ArrayList<Ruta> getRutas(){
		return rutas;
	}
	
	//Metodos de cada uno de los arreglos
	
	/**
	 * Metodo que permite agregar un socio en el ArrayList.
	 * @param socio informacion del socio a agregar.
	 */
	public void agregarSocio(Socio socio){
		this.socios.add(socio);
	}
	
	/**
	 * Retorna la cantidad de socios que tiene el ArrayList
	 */
	public int contarSocios() {
		return this.socios.size();
	}
	
	/**
	 * Metodo que retorna la informacion de un socio del ArrayList de acuerdo a la posicion indicada.
	 * @param i posicion del socio en el ArrayList
	 * @return informacion del socio indicado.
	 */
	public Socio obtenerSocio(int i) {
		return this.socios.get(i);
	}
	
	/**
	 * Metodo que permite buscar la informacion de un socio en el ArrayList de acuerdo a la cedula 
	 * @param cedula informacion de la cedula  del socio a buscar en el ArrayList.
	 * @return la informacion del socio en caso de encontrarlo o null en caso de no encontrar el socio en el ArrayList
	 */
	public Socio buscarSocio(String cedula) {
		for (int i = 0; i < contarSocios(); i++) {
			if (obtenerSocio(i).getCedula().equals(cedula)) {
				return obtenerSocio(i);
			}
		}
		return null;
	}
	
	/**
	 * Metodo que permite buscar la informacion de un socio en el ArrayList de acuerdo al nombre 
	 * @param nombre informacion de la nombre  del socio a buscar en el ArrayList.
	 * @return la informacion del socio en caso de encontrarlo o null en caso de no encontrar el socio en el ArrayList
	 */
	public Socio buscarSocioNombre(String nombre) {
		for (int i = 0; i < contarSocios(); i++) {
			if (obtenerSocio(i).getNombre().equals(nombre)) {
				return obtenerSocio(i);
			}
		}
		return null;
	}
	
	

	
	/**
	 * Metodo que permite buscar la posicion en la que se encuentra 
	 * un socio en el ArrayList de acuerdo a su cedula
	 * @param cedula informacion del identificador del socio a buscar
	 * @return la posicion en la que se encuentra el socio buscado en el ArrayList 
	 * o -1 en caso de no encontrar el socio 
	 */
	
	public  int buscarPosicionSocio(String cedula) {
		for (int i = 0; i < contarSocios(); i++) {
			if (obtenerSocio(i).getCedula().equals(cedula)) {
				return i;
			}
		}
		return -1;
	}
	/**
	 * Metodo que permite remover un socio del ArrayList de acuerdo a su posicion en el mismo
	 * @param i posicion en la que se encuentra el socio a remover
	 * @return informacion del socio removido
	 */
	
	public Socio removerSocio(int i) {
		Socio socioEliminado = obtenerSocio(i);
		socios.remove(i);
		return socioEliminado;
	}
	
	
	/**
	 * Metodo que permite agregar un empleado en el ArrayList.
	 * @param empleado informacion del empleado a agregar.
	 */
	public void agregarEmpleado(Empleado empleado){
		this.empleados.add(empleado);
	}
	
	/**
	 * Retorna la cantidad de empleados que tiene el ArrayList
	 */
	public int contarEmpleados() {
		return this.empleados.size();
	}
	
	/**
	 * Metodo que retorna la informacion de un empleado del ArrayList de acuerdo a la posicion indicada.
	 * @param i posicion del empleado en el ArrayList
	 * @return informacion del empleado indicado.
	 */
	public Empleado obtenerEmpleado(int i) {
		return this.empleados.get(i);
	}
	
	/**
	 * Metodo que permite buscar la informacion de un empleado en el ArrayList de acuerdo a la cedula 
	 * @param cedula informacion de la cedula  del empleado a buscar en el ArrayList.
	 * @return la informacion del empleado en caso de encontrarlo o null en caso de no encontrar el empleado en el ArrayList
	 */
	public Empleado buscarEmpleado(String cedula) {
		for (int i = 0; i < contarEmpleados(); i++) {
			if (obtenerEmpleado(i).getCedula().equals(cedula)) {
				return obtenerEmpleado(i);
			}
		}
		return null;
	}
	
	/**
	 * Metodo que permite buscar la informacion de un empleado en el ArrayList de acuerdo al nombre 
	 * @param nombre informacion de la nombre  del empleado a buscar en el ArrayList.
	 * @return la informacion del empleado en caso de encontrarlo o null en caso de no encontrar el empleado en el ArrayList
	 */
	public Empleado buscarEmpleadoNombre(String nombre) {
		for (int i = 0; i < contarEmpleados(); i++) {
			if (obtenerEmpleado(i).getNombre().equals(nombre)) {
				return obtenerEmpleado(i);
			}
		}
		return null;
	}
	
	/**
	 * Metodo que permite buscar la posicion en la que se encuentra 
	 * un empleado en el ArrayList de acuerdo a su cedula
	 * @param cedula informacion del identificador del empleado a buscar
	 * @return la posicion en la que se encuentra el empleado buscado en el ArrayList 
	 * o -1 en caso de no encontrar el empleado 
	 */
	
	public  int buscarPosicionEmpleado(String cedula) {
		for (int i = 0; i < contarEmpleados(); i++) {
			if (obtenerEmpleado(i).getCedula().equals(cedula)) {
				return i;
			}
		}
		return -1;
	}
	/**
	 * Metodo que permite remover un empleado del ArrayList de acuerdo a su posicion en el mismo
	 * @param i posicion en la que se encuentra el empleado a remover
	 * @return informacion del empleado removido
	 */
	
	public Empleado removerEmpleado(int i) {
		Empleado empleadoEliminado = obtenerEmpleado(i);
		empleados.remove(i);
		return empleadoEliminado;
	}
	
	
	/**
	 * Metodo que permite agregar una ruta en el ArrayList.
	 * @param ruta informacion del ruta a agregar.
	 */
	public void agregarRuta(Ruta ruta){
		this.rutas.add(ruta);
	}
	
	/**
	 * Retorna la cantidad de rutas que tiene el ArrayList
	 */
	public int contarRutas() {
		return this.rutas.size();
	}
	
	/**
	 * Metodo que retorna la informacion de una ruta del ArrayList de acuerdo a la posicion indicada.
	 * @param i posicion de la ruta en el ArrayList
	 * @return informacion de la ruta indicado.
	 */
	public Ruta obtenerRuta(int i) {
		return this.rutas.get(i);
	}
	
	/**
	 * Metodo que permite buscar la informacion de una ruta en el ArrayList de acuerdo a la codigo 
	 * @param codigo informacion del codigo de la ruta a buscar en el ArrayList.
	 * @return la informacion de la ruta en caso de encontrarlo o null en caso de no encontrar la ruta en el ArrayList
	 */
	public Ruta buscarRuta(String codigo) {
		for (int i = 0; i < contarRutas(); i++) {
			if (obtenerRuta(i).getCodigo().equals(codigo)) {
				return obtenerRuta(i);
			}
		}
		return null;
	}
	
	/**
	 * Metodo que permite buscar la posicion en la que se encuentra 
	 * una ruta en el ArrayList de acuerdo a su codigo
	 * @param codigo informacion del identificador de la ruta a buscar
	 * @return la posicion en la que se encuentra la ruta buscado en el ArrayList 
	 * o -1 en caso de no encontrar la ruta 
	 */
	
	public  int buscarPosicionRuta(String codigo) {
		for (int i = 0; i < contarRutas(); i++) {
			if (obtenerRuta(i).getCodigo().equals(codigo)) {
				return i;
			}
		}
		return -1;
	}
	/**
	 * Metodo que permite remover una ruta del ArrayList de acuerdo a su posicion en el mismo
	 * @param i posicion en la que se encuentra la ruta a remover
	 * @return informacion de la ruta removido
	 */
	
	public Ruta removerRuta(int i) {
		Ruta rutaEliminada = obtenerRuta(i);
		rutas.remove(i);
		return rutaEliminada;
	}
	
	
	/**
	 * Metodo que permite generar un recibo asignandole los gastos correspondientes del mismo
	 * @param fechaEmision informacion de la fecha en la que se genero el recibo
	 * @param fechaFacturacion informacion de la fecha de facturacion a la que corresponde el recibo
	 * @param numero informacion del identificador del recibo
	 * @return el recibo generado con sus respectivos gastos asignados
	 */
	
	public Recibo generarReciboSalidaRuta(Date fechaEmision, Date fechaFacturacion, String numero, float montoImpuesto, float montoSeguro, String cedulaSocio, String placaUnidadSocio, String codigoRuta, String cedulaChofer, String horaSalida, String horaEstimadaRegreso, Date fechaEstimadaRegreso) {
		
		Ruta rutaRecibo = new Ruta();
		Socio socioRecibo = new Socio();
		Unidad unidadRecibo = new Unidad();
		Recibo reciboGenerado = new Recibo();
		Empleado choferViajo = new Empleado();
		
		float monto;
		
		reciboGenerado.setFechaEmision(fechaEmision);
		reciboGenerado.setFechaFacturacion(fechaFacturacion);
		reciboGenerado.setCodigo(numero);
		reciboGenerado.setGastoImpuesto(montoImpuesto);
		reciboGenerado.setGastoSeguro(montoSeguro);
		reciboGenerado.setHoraEstimadaRegreso(horaEstimadaRegreso);
		reciboGenerado.setHoraSalida(horaSalida);
		reciboGenerado.setFechaEstimadaRegreso(fechaEstimadaRegreso);
		
		
		// monto del recibo es la suma del gasto por impuesto mas el gasto por seguro
		monto = reciboGenerado.getGastoImpuesto() + reciboGenerado.getGastoSeguro();
		reciboGenerado.setMonto(monto);

		//Buscamos el socio en el arreglo con la cedula que nos dan
		socioRecibo = buscarSocio(cedulaSocio);
		
		//Buscamos la unidad en el arreglo con la placa que nos dan
		unidadRecibo = socioRecibo.buscarUnidad(placaUnidadSocio);
		
		//Buscamos la ruta en el arreglo con el codigo de la ruta que nos dan
		
		rutaRecibo = buscarRuta(codigoRuta);
		
		//agregamos el objeto ruta encontrado a el recibo
		
		reciboGenerado.setRuta(rutaRecibo);
		
		//Buscamos el chofer en el arreglo de empleados
		
		choferViajo = buscarEmpleado(cedulaChofer);
		
		//agregamos el chofer encontrado en el arreglo a el recibo
		
		reciboGenerado.setChoferViajo(choferViajo);
		
		//agregamos la unidad que viajo al recibo
		
		reciboGenerado.setUnidadViajo(unidadRecibo);
		
		//Finalmente agregamos el recibo y se le asigna a la unidad correspondiente
		
		unidadRecibo.agregarRecibo(reciboGenerado);
		
		return reciboGenerado;
		
		
	}
	
	// Arreglo de Tipos de Unidad
	
	/**
	 * Metodo que permite agregar un Tipo de Unidad en el ArrayList.
	 * @param tipounidad informacion de el Tipo de Unidad a agregar.
	 */
	public void agregarTipoUnidad(TipoUnidad tipounidad){
		this.tiposunidades.add(tipounidad);
	}
	
	/**
	 * Retorna la cantidad de Tipos de Tipos de Unidades que tiene el ArrayList
	 */
	public int contarTiposUnidad() {
		return this.tiposunidades.size();
	}
	
	/**
	 * Metodo que retorna la informacion de un Tipo de unidad del ArrayList de acuerdo a la posicion indicada.
	 * @param i posicion de el tip o de unidad en el ArrayList
	 * @return informacion de el tipo de unidad indicado.
	 */
	public TipoUnidad obtenerTipoUnidad(int i) {
		return this.tiposunidades.get(i);
	}
	
	/**
	 * Metodo que permite buscar la informacion de un Tipo de Unidad en el ArrayList de acuerdo al codigo 
	 * @param codigo informacion del codigo del tipo de unidad a buscar en el ArrayList.
	 * @return la informacion de el tipo de unidad en caso de encontrarlo o null en caso de no encontrar el tipo de unidad en el ArrayList
	 */
	public TipoUnidad buscarTipoUnidad(String codigo) {
		for (int i = 0; i < contarTiposUnidad(); i++) {
			if (obtenerTipoUnidad(i).getCodigo().equals(codigo)) {
				return obtenerTipoUnidad(i);
			}
		}
		return null;
	}
	
	/**
	 * Metodo que permite buscar la informacion de un Tipo de Unidad en el ArrayList de acuerdo al nombre 
	 * @param nombre informacion del nombre del tipo de unidad a buscar en el ArrayList.
	 * @return la informacion de el tipo de unidad en caso de encontrarlo o null en caso de no encontrar el tipo de unidad en el ArrayList
	 */
	public TipoUnidad buscarTipoUnidadNombre(String nombre) {
		for (int i = 0; i < contarTiposUnidad(); i++) {
			if (obtenerTipoUnidad(i).getDescripcion().equals(nombre)) {
				return obtenerTipoUnidad(i);
			}
		}
		return null;
	}

	
	
	
	
	
	

}
